//
//  MKUITableViewCellModel.h
//  MKUI
//	封裝了列表的单元格数据,包含有单元格的點擊,刪除,移動block事件,单元格自定義数据內容
//  Created by sushangjin on 14-4-1.
//  Copyright (c) 2014年 sushangjin.com. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "MKCollectionModel.h"
#import "MKCollectionCellModel.h"
#import "MKCollectionSectionModel.h"
#import "MKUITableViewCellSwipeAction.h"
NS_ASSUME_NONNULL_BEGIN

@class MKUITableViewModel,MKUITableViewSectionModel,MKUITableViewCellModel;

@protocol MKUITableViewCellProtocol;

typedef void(^MKUITableViewCellModelBlockC)(__kindof MKUITableViewCellModel *cellModel);	//点击该数据时触发的动作
typedef void(^MKUITableViewCellModelBlockP)(__kindof MKUITableViewCellModel *cellModel,BOOL selected);	//被触控事件选中是触发
typedef void(^MKUITableViewCellModelBlockD)(__kindof MKUITableViewCellModel *cellModel);	//刪除数据时触发
typedef void(^MKUITableViewCellModelBlockM)(__kindof MKUITableViewCellModel *src,
										  __kindof MKUITableViewCellModel *dst);	//移动数据时触发
typedef void(^MKUITableViewCellModelBlockS)(__kindof MKUITableViewCellModel *cellModel,
										  __kindof UITableViewCell<MKUITableViewCellProtocol> *cellView);	//繪製該数据时觸發的动作

@interface MKUITableViewCellModel : MKCollectionCellModel{
@protected
	BOOL _selected;
	NSString *_reuseIdentity;
}
@property(nonatomic,assign) Class<MKUITableViewCellProtocol> cellClass;			//对应的cell類,實例化时默认设置为UITableViewCell
@property(nonatomic,strong,nullable) NSString *indexTitle;//自動進行分组时,使用的索引值
@property(nonatomic,assign) BOOL canEdit;//是否可以被編輯
@property(nonatomic,assign) BOOL canMove;//是否可以被移動

@property(nonatomic,copy,nullable) MKUITableViewCellModelBlockC whenClick;//点击触发
@property(nonatomic,copy,nullable) MKUITableViewCellModelBlockP whenSelected;//被触控事件选中时触发
@property(nonatomic,copy,nullable) MKUITableViewCellModelBlockC whenClickAccessory;//操作按鈕被點擊时的action
@property(nonatomic,copy,nullable) MKUITableViewCellModelBlockD whenDelete;//删除触发.返回YES时，将会将model中删除自身,并动画删除cell
@property(nonatomic,copy,nullable) MKUITableViewCellModelBlockM whenMove;//移動位置觸發

@property(nonatomic,copy,nullable) MKUITableViewCellModelBlockS whenShow;//设置cell繪製的block,在cell被显示时進行自定義畫面的處理.一般是用於cellClass=UITableViewCell时,對UITableViewCell的內容進行定制.如需要更複雜的控制,請創建UITableViewCell的子類來实现.

//左滑显示更多按钮
@property(nonatomic,strong,nullable) NSArray<MKUITableViewCellSwipeAction *> *swipeActions;
@property(nonatomic,assign) BOOL performsFirstActionWithFullSwipe;// default YES, set to NO to prevent a full swipe from performing the first action

@property(nonatomic,strong,nullable) NSArray<MKUITableViewCellSwipeAction *> *leadingSwipeActions;//右滑显示的按钮

@property(nonatomic,readonly,nullable) NSArray<UITableViewRowAction *> *editActions;
- (nullable UISwipeActionsConfiguration *)swipeActionsConfigurationWithIndexPath:(NSIndexPath *)indexPath leading:(BOOL)leading API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);

@property(nonatomic,readonly,nullable) __kindof MKUITableViewModel *tableViewModel;//弱引用外部的tableViewModel
@property(nonatomic,weak,nullable) __kindof UITableViewCell *tableViewCell;//弱引用对应的cell视图
@property(nonatomic,readonly,nullable) UITableView *tableView;//弱引用外部的tableview
@property(nonatomic,assign) UITableViewCellStyle cellStyle;//cell视图的style值,对应于cell.cellStyle
@property(nonatomic,strong) NSString *reuseIdentity;//用於列表重用单元格视图时的标志符,默认为NSStringFromCGClass(self.class)。如果cell的绘制很耗时，可以考虑将reuseIdentity设置为唯一值，防止tableView的重用，以减少重绘次数，提升滚动性能。
+ (instancetype)modelWithValue:(nullable id)modelValue cellClass:(Class)cellClass;
+ (instancetype)modelWithValue:(nullable id)modelValue cellClass:(Class)cellClass whenClick:(nullable MKUITableViewCellModelBlockC)whenClick;

- (void)didClickSelf;
- (void)didClickAccessorySelf;
- (void)didSelectedSelf:(BOOL)selected;
- (void)didDeleteSelf;
- (nullable __kindof MKUITableViewSectionModel *)sectionModel;

/**
 *	tableview在生成UITableViewCell时,手动绘制cell的內容,默认是调用whenShow的block
 */
- (void)displayCell:(UITableViewCell<MKUITableViewCellProtocol> *)cell;

@property(nonatomic) BOOL needReloadCell;//是否需要更新cell的视图内容

/**
 *	刷新视图
 *  reload cell时，系统将会重新实例化一个cell。如果animated=YES时，新的cell将与旧的cell，进行一个fadein、fadeout动画效果。
 *  cell下方可视区域的单元格，也会被重新加载显示
 */
- (void)refresh;
- (void)refreshWithAnimated:(BOOL)animated;
/**
 取消选中某一个Cell
 */
- (void)deselectCellWithAnimated:(BOOL)animated;

- (void)selectCellWithAnimated:(BOOL)animated;
- (void)setSelected:(BOOL)selected animated:(BOOL)animated;

- (void)setFocused:(BOOL)focused refreshed:(BOOL)refreshed;

/// 从tableview中移除单元格
/// @param animated 是否展示动画效果
- (void)removeFromModelWithAnimated:(BOOL)animated;
@end

NS_ASSUME_NONNULL_END
